package pe.com.sisnic.seguros.service.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import pe.com.sisnic.seguros.dao.CreditoDao;
import pe.com.sisnic.seguros.dao.ParametrosDao;
import pe.com.sisnic.seguros.dao.PlanPagoDao;
import pe.com.sisnic.seguros.model.Cliente;
import pe.com.sisnic.seguros.model.Credito;
import pe.com.sisnic.seguros.model.PlanPago;
import pe.com.sisnic.seguros.service.CreditoService;

@Service
public class CreditoServiceImpl implements CreditoService{

	@Resource
	private CreditoDao creditoDao;
	
	@Resource
	private ParametrosDao parametrosDao;
	
	@Resource
	private PlanPagoDao planPagoDao;
	
	@Transactional
	public List<Credito> buscarTodosPorCliente(Cliente cliente, Date fechaAplicacion) {
		String moraAlSaldo = parametrosDao.getMoraAlSaldo(cliente.getCodigoEmpresa());
		List<Credito> listaCreditos = creditoDao.getTodosPorCliente(cliente.getCodigoEmpresa(), cliente.getCodigoCliente());
		for(Credito credito: listaCreditos){
			Map<String, Object> parms = new HashMap<String, Object>();
            parms.put("codigoEmpresa", cliente.getCodigoEmpresa());
            parms.put("codigoAgencia", cliente.getAgencia().getCodigoAgencia());
            parms.put("fechaAplicacion", fechaAplicacion);
            parms.put("nroCredito", credito.getNroCredito());
            
			creditoDao.callPr_pro_datos_deuda(parms);
			credito.setTotalIntereses(Double.parseDouble(parms.get("pInteres").toString()));
			credito.setTotalPrincipal(Double.parseDouble(parms.get("pPrincipal").toString()));
			credito.setTotalMora(Double.parseDouble(parms.get("pMora").toString()));
			credito.setTotalCargos(Double.parseDouble(parms.get("pCargo").toString()));
			creditoDao.callFun_comision(parms);
			credito.setTotalComision(Double.parseDouble(parms.get("totalComision").toString()));
			creditoDao.callFun_poliza(parms);
			credito.setTotalPoliza(Double.parseDouble(parms.get("totalPoliza").toString()));
			credito.setNroCuotasPendientes(0);
			credito.setNroCuotasNoVencidas(0);
			if(!credito.getEstadoCredito().getCodigoEstado().equals("J")){
				Map<String, Object> parmsIVencido = new HashMap<String, Object>();
				parmsIVencido.put("saldoCredito", credito.getSaldoCredito());
				parmsIVencido.put("tipoCalendario", credito.getTipoCalendario());
				parmsIVencido.put("tasaInteres", credito.getTasaInteres());
				parmsIVencido.put("fechaUltimaLiquidacion", credito.getFechaUltimaLiquidacion());
				parmsIVencido.put("fechaAplicacion", fechaAplicacion);
	            parmsIVencido.put("fechaVencimiento", credito.getFechaVencimiento());
	            parmsIVencido.put("fechaUltimoPagoInteresesVenc", credito.getFechaUltimoPagoInteresesVenc());
	            parmsIVencido.put("codigoEmpresa", cliente.getCodigoEmpresa());
	            creditoDao.callFun_interes_vencido(parmsIVencido);
				Double montoVencido = 0.00 + (Double.parseDouble(parmsIVencido.get("montoVencido").toString()));
				if(credito.getInteresVencido() == null){
					credito.setInteresVencido(montoVencido);	
				} else {
					credito.setInteresVencido(credito.getInteresVencido() + montoVencido);	
				}							
			}			
			for(PlanPago planPago : credito.getPlanPagos()){
				//calcula vencimiento mas antiguo
				if(!planPago.getFechaTeorica().after(fechaAplicacion) && credito.getNroCuotasPendientes() == 0){
					credito.setFechaVencimientoMasAntigua(planPago.getFechaTeorica());
				}
				//calcula nro cuotas vencidas y no vencidas
				if(!planPago.getFechaTeorica().after(fechaAplicacion)){
					credito.setNroCuotasPendientes(credito.getNroCuotasPendientes() + 1);
				} else {
					credito.setNroCuotasNoVencidas(credito.getNroCuotasNoVencidas() + 1);
				}
				if(moraAlSaldo.equals("N") && fechaAplicacion.after(planPago.getFechaUltimoPagoMora()) && (fechaAplicacion.getTime() - credito.getFechaVencimientoMasAntigua().getTime() > credito.getGraciaMora())){
					Map<String, Object> parmsMora = new HashMap<String, Object>();
					parmsMora.put("nroCuota", planPago.getNroCuota());
					parmsMora.put("fechaCuota", planPago.getFechaCuota());
					parmsMora.put("fechaAplicacion", fechaAplicacion);
					parmsMora.put("fechaUltimoPagoMora", planPago.getFechaUltimoPagoMora());
					parmsMora.put("tasaMora", credito.getTasaMoratorios());
					parmsMora.put("diasCalendario", credito.getBaseCalculoMoratorios());
					parmsMora.put("codigoEmpresa", cliente.getCodigoEmpresa());
					planPagoDao.callFun_mora(parmsMora);
					planPago.setMora(Double.parseDouble(parmsMora.get("mora").toString()));		
				} else {
					planPago.setMora(0.00);	
				}
			}
		}
		return listaCreditos;
	}
	
	@Transactional
	public Date buscarFechaMaximaCalificacion(Cliente cliente){
		return creditoDao.getMaxFechaUltimaCalificacion(cliente.getCodigoCliente());
	}
}
